import {NavigationGuardNext, RouteLocationNormalizedGeneric} from "vue-router"
import {getLoginEffective} from '@login'
import {useUserStore} from '@user'
import {RouteNameConst} from "@config"

/**
 * 需要登录才能访问的路由列表
 */
const needLoginRoutes: string[] = [
  RouteNameConst.index.en,
  RouteNameConst.sys.children.menu.en,
  RouteNameConst.sys.children.user.en,
  RouteNameConst.sys.children.role.en,
  RouteNameConst.sys.children.permission.en,
]

/**
 * 对于需要登录才能访问的路由，判断用户是否登录，以此决定是否允许用户访问要前往的路由
 *
 * @param {RouteLocationNormalizedGeneric} to 要前往的路由
 * @param {NavigationGuardNext} next 路由跳转函数
 * @returns {Promise<boolean>} 是否允许用户访问，true为允许，false为不允许
 */
export const isLogin = async (to: RouteLocationNormalizedGeneric, next: NavigationGuardNext): Promise<boolean> => {
  // 要前往的路由是否需要登录才能访问
  if (needLoginRoutes.includes(to.name as string)) {
    // 用户未登录，前往登录页面
    if (!(await getLoginEffective()).data) {
      next({name: RouteNameConst.login.en})
      return false
    }
  }
  return true
}

/**
 * 需要退出登录才能访问的路由列表
 */
const needLogoutRoutes: string[] = [
  RouteNameConst.login.en,
]

/**
 * 对于需要退出登录才能访问的路由，判断用户是否未登录，以此决定是否允许用户访问要前往的路由
 *
 * @param {RouteLocationNormalizedGeneric} to 要前往的路由
 * @param {NavigationGuardNext} next 路由跳转函数
 * @returns {Promise<boolean>} 是否允许用户访问，true为允许，false为不允许
 */
export const isLogout = async (to: RouteLocationNormalizedGeneric, next: NavigationGuardNext): Promise<boolean> => {
  // 要前往的路由是否需要退出登录才能访问
  if (needLogoutRoutes.includes(to.name as string)) {
    // 如果本地登录凭证不存在，则允许前往要访问的路由
    const userStore = useUserStore()
    if (!userStore.getLoginCredential()) return true
    // 如果本地登录凭证存在，则判断服务端是否已经注销登录
    // 如果登录仍然有效，则不允许访问
    if((await getLoginEffective()).data) {
      next(false)
      return false
    }
  }
  return true
}
